SpreadSheet URLのgidを利用したカスタムな範囲選択をやってみる
サービス開発室内で毎月行っている、専用のSpreadSheetへの各プロジェクトごとの稼働割合計算の入力漏れが著しく、合算して0となるケース(数値入力ミスではなく明らかな未入力)については週末に詳細を含めての通知を試みました。先月分だけならまだしも、数ヶ月分の入力漏れは完全に忘れられているためです。
実は、SpreadSheetのURLのみでの通知は以前から行っていたのですが、未入力メンバーと該当月を具体的に含めて通知した結果、初めて全員が先月分まで全て埋めました。これは、自身が該当しているかどうかが明確に分かる内容での通知が効果的だということを示しています。
問題は、URLにアクセスした際にSpreadSheetで表示されるシートが過年度分になっていたことです。原因は、シートタブが古い年度ほど左に配置されていたためです。もちろん、全ての欄が埋まっているため、皆が戸惑うことになります。シートの選択はURLのgid加工で行えるとアドバイスを頂いたので試してみましたが、挙動を調べていくと仕様が予想以上の沼でした。
公開されている仕様と実際の挙動を元に解説してみます。
SpreadSheetのgidについて
SpreadSheetのgidがリクエストされたURLクエリに含まれていない場合、アクセス時のレスポンスは以下の構成で返されます。
.../edit?gid=xxxxxxxx#gid=xxxxxxxxx
フラグメント(#)はサーバーには送信されず、サーバーから返されたリソースに対する処理に用いられるパラメータです。クエリのgidはアクセスしたいシートを指定し、フラグメントのgidはブラウザ上で表示後の自動処理用パラメータとして機能します。
シートへアクセスする際にフラグメントを削除するとどうなるか。結論としてはシートのgidがフラグメントに自動補完されます。SpreadSheetの仕様として記載が見つからなかったため、暗黙の初期値として補完されるといったところでしょうか。
なお、クエリのgidとフラグメントのgidが一致しない場合、フラグメントのgidがクエリのgidによって上書きされます。
これらの挙動を踏まえると、アクセス時に一番左のシートを開きたい場合は、クエリのgidを指定するか、もしくはクエリのgidを完全に削除するという2つの選択肢があります。一方、特定のシートを開きたい場合は、そのシートのgidをクエリに含める必要があります。
フラグメントのgidで色々やってみる
フラグメントがブラウザ表示後の処理に使用されているため、入力必須エリアの催促などに活用できないかと考えました。
RFCの解説を参考に、試しにgid=xxxx
をrow=xxxx
と変えたりしましたが特に変わらず。
以下のFAQには実際に動作するサンプルが掲載されていました。2013年に投稿された質問に対して、2017年に追加された仕様として回答が提供されています。
実際にrange指定を入れると、表示時に指定範囲が選択されることが分かります。
この範囲選択を視覚的に行う方法はないのかと思われるかもしれませんが、実はメニューが用意されています。
セル上で右クリックし、メニューの最下部にある「セルでの他の操作項目を表示」を選択します。そこから「このセルへのリンクを取得」をクリックします。
リンクにアクセスすると、選択したセルが自動的にハイライトされていることが確認できます。
GASを使用してURLによる範囲指定を実装したい場合は、以下の記事が参考になります。
あとがき
普段はあまり注目していなかったgidパラメータですが、シートを開く際にコーディングなしで範囲選択を実行できるのは、非常に便利な機能だと気づきました。
シートを開いた時の範囲選択を可変にしたい場合、URLパラメータを動的に変更する目的でGASを使用してURLを生成するのも効果的な方法といえるでしょう。